// 输出的最小单元: 
//      [9, 15] 后景色 | [8, 11] 前景色 | [0. 7] ASCII

#include <tty/tty.h>
#include <stdint.h>

vga_attribute *tty_buffer = 0xB8000;

// (tty_x, tty_y) -> 下一个字符输出的位置
uint32_t tty_x = 0;
uint16_t tty_y = 0;

vga_attribute theme_color = VGA_COLOR_BLACK;

void tty_set_theme(vga_attribute fg, vga_attribute bg) {
    theme_color = (bg << 4 | fg) << 8;
}

void tty_put_char(char chr) {
    vga_attribute unit = theme_color | chr;

    if (chr == '\n') {
        tty_x = 0;
        tty_y ++;
        if (tty_y >= TTY_HEIGHT) {
            tty_scroll_up();
            tty_y --;
        }
        return;
    }

    * (tty_buffer + tty_x + tty_y * TTY_WIDTH) = unit;

    tty_x ++;
    if (tty_x >= TTY_WIDTH) {
        tty_x = 0;
        tty_y ++;
        if (tty_y >= TTY_HEIGHT) {
            tty_scroll_up();
            tty_y --;
        }
    }
}

void tty_put_str(char* str) {
    while (*str != '\0') {
        tty_put_char(*str);
        str ++;
    }
}

void tty_scroll_up() {
    // todo 使用memcpy实现
}

void tty_clear() {
    for (uint32_t i = 0; i < TTY_WIDTH * TTY_HEIGHT; i++) {
        *(tty_buffer + i) = theme_color;
    }
}